#include "../h/apue.h"
#include <errno.h>
#include <limits.h>

#ifdef PATH_MAX
static long pathmax = PATH_MAX;
#else
static long pathmax = 0;
#endif

static long posix_version = 0;
static long xsi_version = 0;

#define PATH_MAX_GUESS 1024

int main(int argc, char ** argv)
{
    char * ptr;
    size_t size = 0;
    ptr = path_alloc(&size);
    //printf("PATH_SIZE:%d.\n", PATH_MAX);
    //printf("_SC_VERSION:%ld.\n", sysconf(_SC_VERSION));
    //printf("_SC_XOPEN_VERSION:%ld.\n",sysconf(_SC_XOPEN_VERSION));
    //printf("_PC_PATH_MAX:%ld.\n",pathconf("/", _PC_PATH_MAX));
    printf("ptr:%p size:%zd.\n", ptr, size);
    return 0;
}


char * path_alloc(size_t *sizep)
{
    char *ptr;
    size_t size;

    if (posix_version == 0)
        posix_version = sysconf(_SC_VERSION);

    if (xsi_version == 0)
        xsi_version = sysconf(_SC_XOPEN_VERSION);

    if (pathmax == 0)
    {
        errno = 0;
        if ((pathmax = pathconf("/", _PC_PATH_MAX)) < 0)
        {
            if (errno == 0)
                pathmax = PATH_MAX_GUESS;
            else
                err_sys("pathconf error for __PC_PATH_MAX");
        } else
            pathmax++;
    }

    if ((posix_version < 200112L) && (xsi_version) < 4)
        size = pathmax + 1;
    else
        size = pathmax;

    if ((ptr = malloc(size)) == NULL)
        err_sys("malloc error for pathname.");

    if (sizep != NULL)
        *sizep = size;

    return ptr;
}
